package com.china08.yxyapi.repository.mg.homework;

import java.util.Date;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.mongodb.repository.Query;

import com.china08.yxyapi.entity.mg.homework.HomeworkTaskReport;

/**
 * 作业:任务:报告:每一个作业，每个学生一条记录
 * 
 * @author Richard Wang
 *
 */
public interface HomeworkTaskReportRepository extends MongoRepository<HomeworkTaskReport, String> {

    /**
     * 通过学生id和作业名称进行查询
     * 
     * @param studentId
     *            要查的学生的id
     * @param Title
     *            要查的学生里的作业名称
     * @param pageable
     * @return
     */
    Page<HomeworkTaskReport> findByStudentIdAndTitle(String studentId, String Title, Pageable pageable);

    /**
     * 通过学生id，小于等于开始时间，作业名称进行查询
     * 
     * @param studentId
     *            要查的学生的id
     * @param publishDate
     *            创建作业的开始日期
     * @param Title
     *            要查的学生里的作业名称
     * @param pageable
     * @return
     */
    Page<HomeworkTaskReport> findByStudentIdAndPublishDateLessThanEqualAndTitleLike(String studentId, Date publishDate,
            String Title, Pageable pageable);

    /**
     * 通过学生id，小于等于开始时间进行查询
     * 
     * @param studentId
     *            要查的学生的id
     * @param publishDate
     *            创建作业的开始日期
     * @param pageable
     * @return
     */
    Page<HomeworkTaskReport> findByStudentIdAndPublishDateLessThanEqual(String studentId, Date publishDate,
            Pageable pageable);

    /**
     * 通过学生id，任务id查询数据
     * 
     * @param studentId
     *            要查的学生的id
     * @param taskId
     *            作业id
     * @return
     */
    HomeworkTaskReport findByStudentIdAndTaskId(String studentId, String taskId);

    /**
     * 通过学生Id 和 学生作业状态 查 该学生的该作业状态的 总数
     * 
     * @param studentId
     *            学生Id
     * @param statusOfFinished
     *            作业状态
     * @return
     */
    Integer countByStudentIdAndStatusOfFinished(String studentId, int statusOfFinished);

    /**
     * 通过学生Id 和 学生作业状态 和 学科名称 查 该学生某个学科的该作业状态的 作业数
     * 
     * @param studentId
     *            学生Id
     * @param statusOfFinished
     *            学生作业状态
     * @param subjectName
     *            学科名称
     * @return
     */
    Integer countByStudentIdAndStatusOfFinishedAndSubjectName(String studentId, int statusOfFinished,
            String subjectName);

    /**
     * 通过任务id，班级id，查询所有记录并且根据（在本次作业中，我的排名次（根据班级排名））字段顺序排序
     * 
     * @param taskId
     *            任务id
     * @param classId
     *            班级id
     * @return
     */
    List<HomeworkTaskReport> findByTaskIdAndClassIdOrderByMyRankingAsc(String taskId, String classId);

    /**
     * 通过任务id，班级id，查询所有记录并且根据学生作业完成时间排序
     * 
     * @param taskId
     *            任务id
     * @param classId
     *            班级id
     * @return
     */
    List<HomeworkTaskReport> findByTaskIdAndClassIdOrderByFinishedDateAsc(String taskId, String classId);

    /**
     * 通过任务id，班级id查询所有记录带分页
     * 
     * @param taskId
     *            任务id
     * @param classId
     *            班级id
     * @param pageable
     *            分页
     * @return
     */
    Page<HomeworkTaskReport> findByTaskIdAndClassIdOrderByRightRateDescDurationAsc(String taskId, String classId,
            Pageable pageable);

    /**
     * 通过任务id，班级id查询所有记录带分页
     * 
     * @param taskId
     *            任务id
     * @param classId
     *            班级id
     * @param pageable
     *            分页
     * @return
     */
    Page<HomeworkTaskReport> findByTaskIdAndClassIdOrderByScoreRateDescDurationAsc(String taskId, String classId,
            Pageable pageable);

    /**
     * 按学生id 和 发布时间小于等于传入时间 和 关键字模糊查询 和 学科不在列表中的 分页查询
     * 
     * @param studentId
     *            学生id
     * @param startDate
     *            发布时间
     * @param title
     *            标题
     * @param subjectNameLst
     *            学科名称列表
     * @param pageable
     * @return
     */
    Page<HomeworkTaskReport> findByStudentIdAndPublishDateLessThanEqualAndTitleLikeAndSubjectNameNotIn(String studentId,
            Date startDate, String title, List<String> subjectNameLst, Pageable pageable);

    /**
     * 按学生id 和 发布时间小于等于传入时间 和 学科不在列表中的 分页查询
     * 
     * @param studentId
     *            学生id
     * @param startDate
     *            发布时间
     * @param subjectNameLst
     *            学科名称列表
     * @param pageable
     * @return
     */
    Page<HomeworkTaskReport> findByStudentIdAndPublishDateLessThanEqualAndSubjectNameNotIn(String studentId,
            Date startDate, List<String> subjectNameLst, Pageable pageable);

    /**
     * 按学生id 和 发布时间小于等于传入时间 和 关键字模糊查询 和 学科名 的 分页查询
     * 
     * @param studentId
     *            学生id
     * @param startDate
     *            发布时间
     * @param title
     *            标题
     * @param subjectName
     *            学科名称
     * @param pageable
     * @return
     */
    Page<HomeworkTaskReport> findByStudentIdAndPublishDateLessThanEqualAndTitleLikeAndSubjectName(String studentId,
            Date startDate, String title, String subjectName, Pageable pageable);

    /**
     * 按学生id 和 发布时间小于等于传入时间 和 学科名 的 分页查询
     * 
     * @param studentId
     *            学生id
     * @param startDate
     *            发布时间
     * @param title
     *            标题
     * @param subjectName
     *            学科名称
     * @param pageable
     * @return
     */
    Page<HomeworkTaskReport> findByStudentIdAndPublishDateLessThanEqualAndSubjectName(String studentId, Date startDate,
            String subjectName, Pageable pageable);

    /**
     * 通过班级id和任务id并且按照个人正确率进行倒序排序
     * 
     * @param taskId
     *            任务id
     * @return
     */
    List<HomeworkTaskReport> findTop3ByTaskIdOrderByRightRateDesc(String taskId);

    /**
     * 通过任务id，班级id和答题完成情况查询记录并且将查出来的所有记录根据学生个人的正确率进行倒序排序
     * 
     * @param taskId
     *            任务id
     * @param classId
     *            班级id
     * @param statusOfFinishedLst
     *            完成情况:-1-逾期未提交,0-未做,1-完成 ,2-已批阅,3-答题中，4-试题类型为试题和通知类作业时提交了一半的状态
     * @return
     */
    List<HomeworkTaskReport> findByTaskIdAndClassIdAndStatusOfFinishedInOrderByRightRateDesc(String taskId,
            String classId, List<Integer> statusOfFinishedLst);

    /**
     * 
     * 获取指定任务，班级，部分学生的作业记录
     * 
     * @param taskId
     *            任务id
     * @param studentId
     *            学生Id
     * @param classIds
     *            班级Id数组
     * @return
     */
    List<HomeworkTaskReport> findByTaskIdAndClassIdAndStudentIdIn(String taskId, String classId,
            List<String> studentIds);

    /**
     * 
     * 获取指定任务，班级，指定学生的作业记录
     * 
     * @param taskId
     *            任务id
     * @param studentId
     *            学生Id
     * @param classIds
     *            班级Id数组
     * @return
     */
    HomeworkTaskReport findTop1ByTaskIdAndClassIdAndStudentId(String taskId, String classId, String studentIds);

    /**
     * 通过任务id 和 任务状态是完成 或者 已批阅的任务 并且按照个人正确率进行倒序排序
     * 
     * @param taskId
     *            任务id
     * @return
     */
    List<HomeworkTaskReport> findTop3ByTaskIdAndStatusOfFinishedInOrderByRightRateDesc(String taskId,
            List<Integer> statusOfFinishedLst);

    /**
     * 获取班级时间范围内任务
     * 
     * @param classId
     *            班级ID
     * @param beginDate
     *            开始时间
     * @param endDate
     *            结束时间
     * @param taskStatus
     *            0 已截止 1进行中
     * @return
     */
    @Query(value = "{'class_id' : ?0 ,'publish_date' : {$gte: ?1, $lte : ?2} ,'stage' : ?3}")
    List<HomeworkTaskReport> findByClassIdAndPublishDateGreaterThanEqualAndPublishDateLessThanEqual(String classId,
            Date beginDate, Date endDate, String stage);

    /**
     * 获取班级时间范围内任务
     * 
     * @param classId
     *            班级ID
     * @param beginDate
     *            开始时间
     * @param endDate
     *            结束时间
     * @param taskStatus
     *            0 已截止 1进行中
     * @return
     */
    @Query(value = "{'class_id' : ?0 ,'subject' : ?1 ,'publish_date' : {$gte: ?2, $lte : ?3} ,'stage' : ?4}")
    List<HomeworkTaskReport> findByClassIdAndSubjectAndPublishDateGreaterThanEqualAndPublishDateLessThanEqual(
            String classId, String subject, Date beginDate, Date endDate, String stage);

    /**
     * 根据班级ID任务ID和任务状态查询当前任务下，处于该状态的本班级的学生人数
     * 
     * @param taskId
     * @param statusOfFinished
     * @return
     */
    Integer countByClassIdAndTaskIdAndStatusOfFinished(String classId, String taskId, Integer statusOfFinished);

    Integer countByClassIdAndTaskId(String classId, String taskId);

    Integer countByStudentIdAndStatusOfFinishedAndPredictDateGreaterThan(String studentId, int i, Date currentDate);

    Integer countByStudentIdAndStatusOfFinishedAndSubjectNameAndPredictDateGreaterThan(String studentId, int i,
            String subjectName, Date currentDate);

    List<HomeworkTaskReport> findByStatusOfFinishedAndPredictDateLessThanOrderByRightRateDesc(int i, Date currentDate);

    Integer countByStudentIdAndStatusOfFinishedAndPredictDateGreaterThanEqualAndPublishDateLessThanEqual(
            String studentId, int i, Date currentDate, Date currentDate2);

    Integer countByStudentIdAndStatusOfFinishedAndSubjectNameAndPredictDateGreaterThanEqualAndPublishDateLessThanEqual(
            String studentId, int i, String subjectName, Date currentDate, Date currentDate2);

    List<HomeworkTaskReport> findTop3ByTaskIdAndClassIdAndStatusOfFinishedInOrderByRightRateDesc(String taskId,
            String classId, List<Integer> statusOfFinishedLst);

    HomeworkTaskReport findTop1ByStudentId(String studentId);

    List<HomeworkTaskReport> findBySchoolIdAndClassIdAndLectureIdAndTaskId(String schoolId, String classId,
            String lectureId, String taskId);

    void deleteByTaskId(String taskId);

    void deleteByTaskIdAndClassId(String taskId, String classId);

    List<HomeworkTaskReport> findTop3ByTaskIdAndClassIdAndStatusOfFinishedInOrderByFinishedDateAsc(String taskId,
            String classId, List<Integer> statusOfFinishedLst);

    Integer countByStatusOfFinishedAndPredictDateGreaterThanEqualAndPublishDateLessThanEqualAndStudentIdIn(int i,
            Date currentDate, Date currentDate2, List<String> childIds);

    List<HomeworkTaskReport> findTop3ByTaskIdAndClassIdAndStatusOfFinishedInOrderByScoreRateDesc(String taskId,
            String classId, List<Integer> statusOfFinishedLst);

    List<HomeworkTaskReport> findBySourceNotAndTaskType(int i, String string);

    List<HomeworkTaskReport> findByStatusOfFinished(int i);

    List<HomeworkTaskReport> findByTaskTypeAndStatusOfFinished(String string, int i);
    // @Modifying
    // @Query(value = " update HomeworkTaskReport set taskType = ?1 where id in
    // (?2) ")
    // Integer updatetaskTypeBytaskType(String tasktype, String taskId);
    //
    // // @Modifying
    // // @Query(value = " update HomeworkTaskReport set ifNeedSumbit = true
    // // ifNeedSumbit ")
    // Integer updatetaskIfneedsubmit();

    List<HomeworkTaskReport> findByTaskTypeAndScoreRateAndStatusOfFinished(String string, double d, int i);

}
